/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Network;

import userservercontroller.*;
import Network.*;
import baseservergrid.*;
import autorization.IAutorization;
import autorization.IRolesTable;
import java.io.File;
import java.io.IOException;
import java.rmi.AccessException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteStub;
import java.rmi.server.UnicastRemoteObject;
import javax.swing.JOptionPane;
import messagemanager.JMessageManager;
import mpiserver.IMpiServer;
import repository.IRepository;
import taskmanager.ITaskManager;
import userservercontroller.UserServerController;

/**
 * Класс инкапсулирующий операцию с RMI взаимодействием клиент-сервер
 * @author Volk ID = 1001
 */
public class ClientNetworkLogic /*implements ModeCompilation*/{


  //---------------------------Аттрибуты класса------------------------------------------------------------
  private IAutorization autorization;
  private IRolesTable roles;
  private IRepository repository;
  private IMpiServer mpiserver;
  private ITaskManager taskmanager;
  private JMessageManager messageManager;

  private UserServerController usc;
  //-------------------------------------------------------------------------------------------------------

  //---------------------------------Интерфейсные методы---------------------------------------------------
  //Инициализировать модуль сетевого взаймодействия
  public void initNetwork(IAutorization autorization, IRolesTable roles, 
          IRepository repository,IMpiServer mpiserver,ITaskManager taskmanager, JMessageManager messageManager)
          throws IOException{
     this.autorization = autorization;
     this.roles = roles;
     this.repository = repository;
     this.mpiserver=mpiserver;
     this.taskmanager=taskmanager;
     this.messageManager = messageManager;
     if(baseservergrid.ModeCompilation.DEBUG){
     try{
       File file = new File ("build"+File.separator+"classes");
       String command; //Команла на запуск утилиты tmic для генерации заглушки
       //System.out.println(System.getProperty("java.home"));
       command="\""+System.getProperty("java.home")+
               File.separator+".."+File.separator+"bin"+File.separator+"rmic.exe"+ "\" -classpath "+"\"" + file.getAbsolutePath() + "\""
              + " -d \""+ file.getAbsolutePath() + "\" " + "userservercontroller.UserServerController";
       System.out.println("Run: "+command);
       Runtime.getRuntime().exec(command);

       System.out.println("Sleep 5 seconds while rmic generate the sub...");
       for(int i=5;i>0;i--){
           System.out.print(""+i+" ");
           Thread.currentThread().sleep(1000);
       }
       System.out.println("Wake up");
     }catch(InterruptedException ie){
      JOptionPane.showMessageDialog(null, "При создании заглушки Клиент-Сервер произошла ошибка: прерывание процесса");
     }
   }
  }

  /**
   * Активировать сервер сервером
   * @param port - номер порта
   * @return true - активация завершилась успешно, false - порт занят
   */
  public boolean activation(){

     Registry stReg = null;
     RemoteStub clientStub = null;
     try{
       usc = new UserServerController
               (autorization,roles,repository,mpiserver,taskmanager,messageManager);
      clientStub = (RemoteStub) UnicastRemoteObject.exportObject(usc,0);

      try{
      int port = NetworkLogic.getPort();
      stReg = LocateRegistry.createRegistry(NetworkLogic.getPort());
      }catch(IllegalArgumentException lae){
       JOptionPane.showMessageDialog(null, "Неверно задан номер порта - выход за диапозон допустимых значений");
      return false;}

      }catch(RemoteException e){
      /*
      try{
       stReg = LocateRegistry.getRegistry(NetworkLogic.getPort());
      }catch(RemoteException ex){
       JOptionPane.showMessageDialog(null, "При инициализации сети произошла ошибка");
       return false;
      }*/
      return false; //Порт занят
     }
      try{
      System.out.println("Binding.....");
      stReg.rebind("USCProxy", clientStub);
      if(ModeCompilation.DEBUG){

       System.out.println("Test: write all bind rmi-stub");
       String[] bindNames = stReg.list();
       for(int i = 0; i < bindNames.length; i++){
         System.out.println(bindNames[i]);
       }
      }}catch(RemoteException e){
        JOptionPane.showMessageDialog(null, "При инициализации сети произошла ошибка");
        return false;
      }


     System.out.println("------------------------------");

     return true;
    }

  /**
   * Отключить всех подключенных пользователей от системы
   */
  public void disconnectAllUsers(){
   usc.disconnectAll();
  }



  //-------------------------------------------------------------------------------------------------------
}
